package mx.itesm.goyostacoadventure;

import android.view.KeyEvent;
import android.widget.Toast;

import org.andengine.engine.camera.Camera;
import org.andengine.engine.handler.timer.ITimerCallback;
import org.andengine.engine.handler.timer.TimerHandler;
import org.andengine.engine.options.EngineOptions;
import org.andengine.engine.options.ScreenOrientation;
import org.andengine.engine.options.resolutionpolicy.FillResolutionPolicy;
import org.andengine.entity.scene.Scene;
import org.andengine.entity.util.FPSCounter;
import org.andengine.input.touch.controller.MultiTouch;
import org.andengine.ui.activity.SimpleBaseGameActivity;

import java.io.IOException;


/**
 * Esta es la clase principal que controla completamente el juego
 * Aquí se implementa el ciclo de vida
 */
public class ControlJuego extends SimpleBaseGameActivity
{
    // Dimensiones de la cámara
    public static final int ANCHO_CAMARA = 800;
    public static final int ALTO_CAMARA = 480;
    // La cámara
    private Camera camara;
    // El administrador de escenas
    private AdministradorEscenas admEscenas;
    //El administrador de sonidos
    private AdministradorSonidos admSonidos;


    @Override
    public EngineOptions onCreateEngineOptions() {
        camara = new Camera(0,0,ANCHO_CAMARA,ALTO_CAMARA);
        EngineOptions opciones =  new EngineOptions(true, ScreenOrientation.LANDSCAPE_FIXED,
                new FillResolutionPolicy(),camara);
                opciones.getAudioOptions().setNeedsMusic(true);
                opciones.getAudioOptions().setNeedsSound(true);
        /*if(MultiTouch.isSupported(this)) {
            if(MultiTouch.isSupportedDistinct(this)) {
                Toast.makeText(this, "MultiTouch detected --> Both controls will work properly!", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(this, "MultiTouch detected, but your device has problems distinguishing between fingers.\n\nControls are placed at different vertical locations.", Toast.LENGTH_LONG).show();
            }
        } else {
            Toast.makeText(this, "Sorry your device does NOT support MultiTouch!\n\n(Falling back to SingleTouch.)\n\nControls are placed at different vertical locations.", Toast.LENGTH_LONG).show();
        }*/
        opciones.getTouchOptions().setNeedsMultiTouch(true);
        return opciones;
    }

    @Override
    protected void onCreateResources() throws IOException {
        // Pasamos toda la información al administrador de recursos
        AdministradorRecursos.inicializarAdministrador(mEngine,this,
                camara,getVertexBufferObjectManager());
        admEscenas = AdministradorEscenas.getInstance();
        admSonidos = AdministradorSonidos.getInstance();
    }

    @Override
    protected Scene onCreateScene() {
        //FPS
        mEngine.registerUpdateHandler(new FPSCounter());
        // Crea la primer escena que se quiere mostrar
        admEscenas.crearEscenaSplash();
        admEscenas.setEscena(TipoEscena.ESCENA_SPLASH);
        // programa la carga de la segunda escena, despues de cirto tiempo
        mEngine.registerUpdateHandler(new TimerHandler(2, new ITimerCallback() {
            @Override
            public void onTimePassed(TimerHandler pTimerHandler) {
                mEngine.unregisterUpdateHandler(pTimerHandler); //Invalida el timer
                // CAMBIA LA ESCENA del MENÚ
                //** 1. Crea la escena del menú
                //** 2. Pone la escena del menú
                //** 3. LIBERA la escena de Splash
                admSonidos.cargarMusicaPantallas();
                admSonidos.cargarSonidosBtn();
                admSonidos.setMusicaBase(TipoMusica.MUSICA_PANTALLAS);
                admEscenas.crearEscenaMENU();
                admEscenas.setEscena(TipoEscena.ESCENA_MENU);
                admEscenas.liberarEscenaSplash();
            }
        }));
        return admEscenas.getEscenaActual();
    }

    // Atiende la tecla de BACK
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode==KeyEvent.KEYCODE_BACK) {
            if(admEscenas.getTipoEscenaActual()==TipoEscena.ESCENA_MENU) {
                // Si está en el menú, termina
                finish();
            } else {
                // La escena que esté en pantalla maneja el evento
                admEscenas.getEscenaActual().onBackKeyPressed();
            }
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

    // La aplicación sale de memoria
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (admEscenas!=null) {
            System.exit(0);
        }
    }

    //Se implementa para pausar la musica en caso de que este reproduciendo al salir
    @Override
    public synchronized void onPauseGame(){
        //al pausar
        admSonidos.pausarMusica();
        super.onResumeGame();
    }

    //reaunad la musica menu
    @Override
    public synchronized void onResumeGame(){
        //reaundar
        admSonidos.reproducirMusica();
        super.onResumeGame();
    }


}